// function fn(x: number, y: number): number {
//   return x + y
// }
// let fn: (x: number, y: number) => number
// fn = (x: number, y: number): number => {
//   return x + y
// }
// let fn: (x: number, y: number) => number = (x: number, y: number): number => {
//   return x + y
// }

// 注意: 如果有些参数,不需要则可以设置为可选参数. 并且可选参数必须在必填参数后面
// function fn(x: number, y: number, z?: number): number {
//   return x + y
// }

// fn(1, 2)

// 注意: 一旦给形参设置了默认值,这个参数,相当于变成了可选.
// function fn(x: number = 3, y: number): number {
//   return x + y
// }
// // 如果默认值写在前面,则传实参时,还是要占一个位置
// fn(undefined, 2)

// function fn(x: number, ...args: any[]) {
//   console.log(x, args)
// }
// fn(1, 2, 3, 'c', 5, false)

// 重载. 为了让ts可以知道更具体的数据类型
// function reverse(x: number): number
// function reverse(x: string): string
// function reverse(x: number | string): number | string | void {
//   if (typeof x === 'number') {
//     return Number(x.toString().split('').reverse().join(''))
//   } else if (typeof x === 'string') {
//     return x.split('').reverse().join('')
//   }
// }

// interface SearchFunc {
//   (source: string, subString: string): boolean
// }

// let mySearch: SearchFunc = function (
//   source: string,
//   subString: string
// ): boolean {
//   return source.search(subString) !== -1
// }
